  <?php
/**
* Класс-модель авторизации пользователя
* 
* @author larein
* @version 1.0.0 / 21.07.2011
*/
class LoginForm extends AccountPending
{
    /**
    * @var boolean запомнить пользователя
    */
    public $rememberMe;
    /**
    * @var string проверочный код (каптча)
    */
    public $verifyCode; 
    /**
    * @var boolean использовать проверочный код (каптчу)
    */
    public $useCaptcha = false;

    private $_identity;

    public static function model($className=__CLASS__)
    {
       return parent::model($className);
    }
    
    /**
    * Возвращает массив с правилами валидации формы
    */
    public function rules()
    {
        return array(
            // логин
            array('name', 'required', 'message'=>Yii::t('models', 'Вы не ввели логин')),
            array('name', 'length', 'min'=>4, 'max'=>50, 'tooShort'=>Yii::t('models', 'Логин не может быть короче 4 символов'), 'tooLong'=>Yii::t('models', 'Логин не может быть длиннее 50 символов')),
            array('name', 'match', 'pattern'=>'/^[A-z,0-9_-\s]+$/u', 'message'=>Yii::t('models', 'Ваш логин может содержать только латинские буквы, цифры а также символы _ и -')),
            array('name', 'exist', 'message'=>Yii::t('models', 'Аккаунт не найден')), 
            // пароль
            array('password', 'required', 'message'=>Yii::t('models', 'Вы не ввели пароль')),
            array('password', 'length', 'min'=>5, 'max'=>50, 'tooShort'=>Yii::t('models', 'Пароль не может быть короче 5 символов'), 'tooLong'=>Yii::t('models','Пароль не может быть длиннее 50 символов')),
            array('password', 'match', 'pattern'=>'/^[A-Z,a-z,0-9_-\s]+$/u', 'message'=>Yii::t('models', 'Ваш пароль может содержать только латинские буквы, цифры а также символы _ и -')),
            // checkbox запомнить меня
            array('rememberMe', 'boolean', 'trueValue'=>'1', 'falseValue'=>'0', 'message'=>Yii::t('models', 'Данное поле должно содержать значение true или false')),
            // проверочный код
            array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'message'=>Yii::t('models', 'Вы не смогли ввести правильный код с изображения'), 'on'=>'scenarioUseCaptcha'),
            // проверям введенный пароль с паролем в базе данных
            array('password', 'authenticate'),
        );
    }

    /**
    * Возвращает массив меток формы 
    */
    public function attributeLabels()
    {
        return array(
            'name'=>Yii::t('models', 'Логин'),
            'password'=>Yii::t('models', 'Пароль'),
            'rememberMe'=>Yii::t('models', 'Запомнить меня'),
            'verifyCode'=>Yii::t('models', 'Проверочный код'),
        );
    }

    /**
    * Аутентификация
    * Данный метод используется как правило валидации формы
    */
    public function authenticate($attribute,$params)
    {
          if(!$this->hasErrors())
          {
            $this->_identity = new UserIdentity($this->name,$this->password);
            $this->_identity->authenticate();
            
            if($this->_identity->errorCode != UserIdentity::ERROR_NONE)
            {
                $messages = array(
                    2=> array('field'=>'password','message'=>Yii::t('models', 'Вы ввели неправильный пароль')),
                    3=> array('field'=>'login', 'message'=>Yii::t('models', 'Из соображений безопасности мы ограничили число неудачных попыток. К сожалению, Вы уже исчерпали этот лимит. Повторите попытку через {timeout}', array('{timeout}'=>(Y::param('timeoutAfterFailedLoginAttempts', 600)/60) . ' ' . Yii::t('models', 'мин.')))),
                    4=> array('field'=>'login','message'=>Yii::t('models', 'Аккаунт не активирован')),
                );
                if(array_key_exists($this->_identity->errorCode, $messages))
                    $this->addError($messages[$this->_identity->errorCode]['field'], $messages[$this->_identity->errorCode]['message']); 
            }
        }
    }

    /**
    * Метод авторизирует пользователя в случае если данные введены правильно
    * @return boolean возвращает true если авторизация успешна
    */
    public function login()
    {
        if($this->_identity===null)
        {
            $this->_identity=new UserIdentity($this->name,$this->password);
            $this->_identity->authenticate();
        }
        
        // если нет ошибок
        if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
        {
            $duration=$this->rememberMe ? 3600*24*30 : 0;           // запоминаем на 30 дней
            Yii::app()->user->login($this->_identity,$duration);
            Yii::app()->session->remove('errorEnter');              // очищаем количество ошибок в сессии
            Yii::app()->cache->delete('auth_'.$this->name);         // очищаем кеш            
            return true;
        }
        else
            return false;
    }
}
